﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TCC_Hotel.Entidades;
using System.Data.SqlClient;
using System.Configuration;

namespace TCC_Hotel.Repositorio
{
    public class LoginRepositorio
    {
        ControleBancoDados controle = new ControleBancoDados();

        /// <summary>
        /// Recupera no banco todos as permissoes cadastradas
        /// </summary>
        /// <returns>Lista com todos as permissoes</returns>
        public List<Permissao> RecuperarPermissoes()
        {
            List<Permissao> listaResposta = new List<Permissao>();
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;
            //definição do comando sql
            string sql =
                "SELECT * FROM Permissoes";

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open(); 

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();


                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados e monta objeto funcionarios
                listaResposta = ListarPermissoes(reader);

                //fecha a conexao
                con.Close();


            }

     //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {

                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();

                    //le os dados retornados e monta objeto funcionarios
                    listaResposta = ListarPermissoes(reader);

                    //fecha a conexao
                    con2.Close();

                }
            }
            finally
            {
                con.Close();
            }

            return listaResposta;


        }


        /// <summary>
        /// Edita a permissao de um usuario nos bancos de dados
        /// </summary>
        /// <param name="CPF">usuario que sera editado</param>
        /// <returns>true se editou ou false se não</returns>
        public bool EditarPermissoes(Permissao Permissao)
        {
            //definição do comando sql
            string sql =
                "UPDATE Permissoes SET " +
                "Cadastrar_Compra = '" + Permissao.Cadastrar_Compra + "', " +
                "Listar_Estoque = '" + Permissao.Listar_Estoque + "', " +
                "Editar_Estoque = '" + Permissao.Editar_Estoque + "', " +
                "Listar_Apartamento = '" + Permissao.Listar_Apartamento + "', " +
                "Cadastrar_Apartamento = '" + Permissao.Cadastrar_Apartamento + "', " +
                "Listar_Empresas = '" + Permissao.Listar_Empresas + "', " +
                "Cadastrar_Empresas = '" + Permissao.Cadastrar_Empresas + "', " +
                "Listar_Fornecedores = '" + Permissao.Listar_Fornecedores + "', " +
                "Cadastrar_Fornecedores = '" + Permissao.Cadastrar_Fornecedores + "', " +
                "Listar_Funcionarios = '" + Permissao.Listar_Funcionarios + "', " +
                "Cadastrar_Funcionarios = '" + Permissao.Cadastrar_Funcionarios + "', " +
                "Desligar_Funcionarios = '" + Permissao.Desligar_Funcionarios + "', " +
                "Listar_Hospedes = '" + Permissao.Listar_Hospedes + "', " +
                "Cadastrar_Hospedes = '" + Permissao.Cadastrar_Hospedes + "', " +
                "Listar_Produtos = '" + Permissao.Listar_Produtos + "', " +
                "Cadastrar_Produtos = '" + Permissao.Cadastrar_Produtos + "', " +
                "Reservas = '" + Permissao.Reservas + "', " +
                "Hospedes_Presentes = '" + Permissao.Hospedes_Presentes + "', " +
                "Hospedes_Antigos = '" + Permissao.Hospedes_Antigos + "', " +
                "Cadastrar_Vendas = '" + Permissao.Cadastrar_Vendas + "', " +
                "Gerenciar_Permissoes = '" + Permissao.Gerenciar_Permissoes + "', " +
                "Gerenciar_Parametros = '" + Permissao.Gerenciar_Parametros + "', " +
                "Gerenciar_Outras = '" + Permissao.Gerenciar_Outras + "', " +
                "Gerenciar_Receitas = '" + Permissao.Gerenciar_Receitas + "' WHERE Usuario = '" + Permissao.Usuario + "'";

            //Método que escreve o comando sql nos bancos de dados
            return controle.EscreveBancoDados(sql);

        }


        /// <summary>
        /// Lê dados da tabela correspondente através de um comando SQL os montando a lista que é retornada
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        public List<Permissao> ListarPermissoes(SqlDataReader reader)
        {
            List<Permissao> listaResposta = new List<Permissao>();

            //le os dados retornados e monta objeto Permissao
            while (reader.Read())
            {
                listaResposta.Add(new Permissao()
                {
                    Usuario = Convert.ToString(reader["Usuario"]),
                    Cadastrar_Compra = Convert.ToBoolean(reader["Cadastrar_Compra"]),
                    Listar_Estoque = Convert.ToBoolean(reader["Listar_Estoque"]),
                    Editar_Estoque = Convert.ToBoolean(reader["Editar_Estoque"]),
                    Listar_Apartamento = Convert.ToBoolean(reader["Listar_Apartamento"]),
                    Cadastrar_Apartamento = Convert.ToBoolean(reader["Cadastrar_Apartamento"]),
                    Listar_Empresas = Convert.ToBoolean(reader["Listar_Empresas"]),
                    Cadastrar_Empresas = Convert.ToBoolean(reader["Cadastrar_Empresas"]),
                    Listar_Fornecedores = Convert.ToBoolean(reader["Listar_Fornecedores"]),
                    Cadastrar_Fornecedores = Convert.ToBoolean(reader["Cadastrar_Fornecedores"]),
                    Listar_Funcionarios = Convert.ToBoolean(reader["Listar_Funcionarios"]),
                    Cadastrar_Funcionarios = Convert.ToBoolean(reader["Cadastrar_Funcionarios"]),
                    Desligar_Funcionarios = Convert.ToBoolean(reader["Desligar_Funcionarios"]),
                    Listar_Hospedes = Convert.ToBoolean(reader["Listar_Hospedes"]),
                    Cadastrar_Hospedes = Convert.ToBoolean(reader["Cadastrar_Hospedes"]),
                    Listar_Produtos = Convert.ToBoolean(reader["Listar_Produtos"]),
                    Cadastrar_Produtos = Convert.ToBoolean(reader["Cadastrar_Produtos"]),
                    Reservas = Convert.ToBoolean(reader["Reservas"]),
                    Hospedes_Presentes = Convert.ToBoolean(reader["Hospedes_Presentes"]),
                    Hospedes_Antigos = Convert.ToBoolean(reader["Hospedes_Antigos"]),
                    Cadastrar_Vendas = Convert.ToBoolean(reader["Cadastrar_Vendas"]),
                    Gerenciar_Permissoes = Convert.ToBoolean(reader["Gerenciar_Permissoes"]),
                    Gerenciar_Parametros = Convert.ToBoolean(reader["Gerenciar_Parametros"]),
                    Gerenciar_Outras = Convert.ToBoolean(reader["Gerenciar_Outras"]),
                    Gerenciar_Receitas = Convert.ToBoolean(reader["Gerenciar_Receitas"])

                });

            }
            return listaResposta;


        }
    }
}